package itheima.a02polymorphismdemo2;

public class Test {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边,运行看右边
        a.eat();//打印的是狗在啃骨头

        //多态的弊端
        //不能调用子类的特有功能
        //当调用成员的方法的时候,编译看左边,运行看右边
        //那么编译的时候首先会检查左边的父类有没有这个方法,如果没有直接报错

        //解决方法
        //变回子类类型即可
        //比如int a=10,把a转换为byte 强制即可
        //int b=(byte)a;
        //Dog d=(Dog)a
        //转换的时候不能瞎转,如果转成其他类的类型,就会报错
        /*if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.lookhome();

        } else if (a instanceof cat) {
            cat c = (cat) a;
            c.sleep();
        } else {
            System.out.println("没有这个类型,无法转换");
        }

*/
        //新特性
        //先判断a是否为Dog类型,如果是,则强转为Dog类型,转换之后的变量名为d
        //如果不是,则不强制,结果直接是false
        if (a instanceof Dog d) {
            d.lookhome();

        } else if (a instanceof cat c) {
            c.sleep();
        } else {
            System.out.println("没有这个类型,无法转换");
        }
    }
}

class Animal {
    public void eat() {
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗在啃骨头");
    }

    public void lookhome() {
        System.out.println("狗在看家");
    }
}

class cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫在吃鱼");
    }

    public void sleep() {
        System.out.println("猫在睡觉");
    }
}
